package de.mnit.basis.sys.version;

import java.io.InputStream;

import de.mnit.basis.ZENTRAL;
import de.mnit.basis.daten.typ.zeit.S_Zeitpunkt;
import de.mnit.basis.daten.typ.zeit.Zeitpunkt;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.fehler.system.F_Sys_Datei;
import de.mnit.basis.fehler.system.F_Sys_InOut;
import de.mnit.basis.sys.Ausgabe;
import de.mnit.basis.sys.datei.DSDatei;
import de.mnit.basis.sys.datei.DSLokal;
import de.mnit.basis.sys.datei.DateiText;
import de.mnit.basis.sys.datei.JarZugriff;
import de.mnit.basis.sys.datei.S_Datei;
import de.mnit.basis.sys.datei.S_Ordner;
import de.mnit.basis.sys.stream.StreamHilfe;

/**
 * @author Michael Nitsche
 * 16.08.2008	Erstellt
 *
 * TODO nach mn.basis.statisch
 */
public class VersionsNummer {

	private static final boolean online = ZENTRAL.online();


	private VersionsNummer() {
		Fehler.sonstige.da_Verboten("Bitte statisch verwenden");
	}


	public static void setze(VersionsInfo info) throws F_Sys_InOut {
		if(online) {
			Ausgabe.debug("Kein Versions-Update, da Online!");
			return;
		}
		String dateipfad=iDateiPfad();
		S_Ordner aktuell=DSLokal.aktuell();
		if(aktuell.kenntO("src"))
			aktuell=aktuell.o("src");
		String datei=aktuell.gPfadKomplett()+dateipfad;
		VersionsInfo info2=iLesen(dateipfad);
		long alt= info2==null ? 0 : info2.build;
		iSchreiben(datei, info.major, info.minor, info.art, info.artnr, info.fixnr, alt+1, Zeitpunkt.neu());
	}

	public static VersionsInfo gib() throws F_Sys_InOut {
		String dateipfad=iDateiPfad();
		return iLesen(dateipfad);
	}

	// INTERN

	private static VersionsInfo iLesen(String dateipfad) throws F_Sys_InOut {
		InputStream stream=iDateiLesen(dateipfad);
		if(stream==null) {
			Ausgabe.debug("Stream wurde nicht aufgebaut");
			return null;
		}

		String s=StreamHilfe.liesASCII(stream);
		if(s==null || s.length()==0) {
			Ausgabe.debug("Nichts gelesen!");
			return null;
		}
//		Ausgabe.debug(s);
		return iZuInfo(s);
	}

	private static void iSchreiben(String datei, int major, int minor, VERSIONSART art, int artnr, int fixnr, long build, S_Zeitpunkt zeit) throws F_Sys_Datei {
		String s=zuString(major, minor, art, artnr, fixnr, build, zeit);
		S_Datei d=DSDatei.neu(datei);
		DateiText.setze(d, s);
	}

	private static InputStream iDateiLesen(String dateipfad) {
		try {
			return JarZugriff.gJarStream(dateipfad);
		}
		catch(F_Sys_InOut e) {
			Fehler.zeig(e, false);
			return null;
		}
	}

	private static String iDateiPfad() {
		StackTraceElement[] trace = new Throwable().getStackTrace();
//		Ausgabe.debug(trace);
//		String link=trace[trace.length-1].toString(); //Geht nicht, da ggf. vorher Wrapperklassen gestartet werden (z.B. Webstart)!
		String klasse=trace[2].getClassName(); //2 paßt, da über gib/setze immer an zweiter Stelle!
//		Ausgabe.debug(klasse);
		char t='/'; //Sys.gTrennerVerz(); Bei Win sonst ein Backslash
		String erg=t+klasse.replace('.', t)+".build";
//		Ausgabe.debug(erg);
		return erg;
	}

	private static VersionsInfo iZuInfo(String s) {
		String[] sa=s.split(" ");
		if(sa.length==7) //Alt
			return new VersionsInfo(Integer.parseInt(sa[0]), Integer.parseInt(sa[1]), VERSIONSART.gib(sa[2].charAt(0)), Integer.parseInt(sa[3]), 1, Long.parseLong(sa[4]), Zeitpunkt.neu(sa[5]+" "+sa[6]));
		if(sa.length==8) //Aktuell
			return new VersionsInfo(Integer.parseInt(sa[0]), Integer.parseInt(sa[1]), VERSIONSART.gib(sa[2].charAt(0)), Integer.parseInt(sa[3]), Integer.parseInt(sa[4]), Long.parseLong(sa[5]), Zeitpunkt.neu(sa[6]+" "+sa[7]));
		return null;
	}

	private static String zuString(int major, int minor, VERSIONSART art, int artnr, int fixnr, long build, S_Zeitpunkt zeit) {
		return major+" "+minor+" "+art.zeichen+" "+artnr+" "+fixnr+" "+build+" "+zeit.zuTextEDV();
	}
}
